#pragma once

#include "NFServerComm/NFServerCommon/NFIDescStore.h"
#include "NFServerComm/NFServerCommon/NFIDescTemplate.h"
#include "NFLogicCommon/NFDescStoreMacrosDefine.h"
#include "NFLogicCommon/NFDescStoreTypeDefines.h"
#include "E_PartnerEquipData.nanopb.h"
#ifndef MAX_PARTNEREQUIPDATA_PARTNEREQUIPSTONESLOTDATA_NUM
#define MAX_PARTNEREQUIPDATA_PARTNEREQUIPSTONESLOTDATA_NUM 20
#endif

struct PartnerEquipStoneSlotPartEquipType
{
	PartnerEquipStoneSlotPartEquipType()
	{
		if (EN_OBJ_MODE_INIT == NFShmMgr::Instance()->GetCreateMode()) {
			CreateInit();
		}
		else {
			ResumeInit();
		}
	}
	int CreateInit()
	{
		part=0;
		equip_type=0;
		return 0;
	}
	int ResumeInit()
	{
		return 0;
	}
	int64_t part;
	int64_t equip_type;
	bool operator==(const PartnerEquipStoneSlotPartEquipType& data) const
	{
		 return part== data.part && equip_type== data.equip_type;
	}
	std::string ToString() const
	{
		std::stringstream ios;
		ios << part;
		ios << ",";
		ios << equip_type;
		return ios.str();
	}
};

namespace std
{
	template<>
	struct hash<PartnerEquipStoneSlotPartEquipType>
	{
		size_t operator()(const PartnerEquipStoneSlotPartEquipType& data) const
		{
			return NFHash::hash_combine(data.part,data.equip_type);
		}
	};
}


class PartnerEquipStoneSlotDesc : public NFI_DESC_TEMPLATE_MACRO(PartnerEquipStoneSlotDesc, E_PartnerEquipStoneSlot, EOT_CONST_PARTNEREQUIPDATA_PARTNEREQUIPSTONESLOTDATA_DESC_ID, MAX_PARTNEREQUIPDATA_PARTNEREQUIPSTONESLOTDATA_NUM)
public:
	PartnerEquipStoneSlotDesc();
	virtual ~PartnerEquipStoneSlotDesc();
	int CreateInit();
	int ResumeInit();
public:
	int Load(NFResDb *pDB) override;
	int LoadDB(NFResDb *pDB) override;
	int CheckWhenAllDataLoaded() override;
	const E_PartnerEquipStoneSlot* GetDescByPartEquipType(int64_t part, int64_t equipType);
private:
	NFShmHashMap<PartnerEquipStoneSlotPartEquipType, uint64_t, MAX_PARTNEREQUIPDATA_PARTNEREQUIPSTONESLOTDATA_NUM> m_partEquipTypeComIndexMap;
};
